import requests
import os
import threading
import json
import time


def listFileDir(filePath):
    """将指定目录下的所有子目录整理成目录列表
    参数：
        filePath str : 文件路径
    返回：
        list : 文件 和 目录列表
    """
    result = []#返回的是文件全路径
    filenames = os.listdir(filePath)
    for name in filenames:
        result.append(os.path.join(filePath,name))
    return result

def theTxtFile(filePaths):
    """筛选文件列表中的文本文件
    参数：
        filePaths list : 路径列表
    返回：
        list : 文本文件路径列表
    """
    result = []
    for name in filePaths:
        if os.path.isfile(name):
            spName = str(name).split('.')
            if spName[len(spName) - 1] == 'txt':
                result.append(name)
    return result

def theDir(filePaths):
    """从列表中筛选出所有目录
    参数：
        filePaths list : 要筛选的目录列表
    返回 :
        list : 得到的目录列表
    """
    result = []
    for path in filePaths:
        if os.path.isdir(path):
            result.append(path)
    return result
print(
'''
=============
初始化完成！
欢迎使用本程序，本程序可以将指定目录及其所有子目录下的文本文件全部转为简体版本！
但程序可能出现问题，所以实验之前请务必做好备份。
Copyright © Dreamelf
=============
'''
)
bootPath = input('请填入需要繁体转简体的主目录：>')
if not os.path.isdir(bootPath):
    print('输入不是目录！程序终止！')
    input('回车继续')
    os._exit(1)
txtFileList = []
def factory(path):
    """工厂方法，用以迭代所有目录下的文本文件
    参数 : 
        path : 当前要生产的目录
    返回 : 
        无
    """
    global txtFileList
    dirs = theDir(listFileDir(path))
    if len(dirs) != 0:  #如果下方还有子目录，则继续递
        for dir in dirs:
            factory(dir)
    txtFiles = theTxtFile(listFileDir(path))
    for txtPath in txtFiles:
        txtFileList.append(txtPath)

def upLoadTxt(path):
    """利用接口转换文件
    参数 : 
        path str : TXT文件的路径
    返回 : none
    """
    appkey = '3e587b86797182ff'
    typ = '2s'
    file = open(path,'r+',encoding='utf-8')
    content = file.read()
    
    url = 'https://api.jisuapi.com/fontconvert/convert'
    data = {'appkey':appkey,'content':content,'type':typ}
    subdata = json.dumps(data).encode(encoding='utf-8')
    req = requests.post(url=url,data=data)
    req = json.loads(req.text)
    if req['msg'] == 'ok':
        file.seek(0)
        file.write(req['result']['rcontent'])
        print('已成功完成：文件路径' + path)
    else:
        print('调用出错，文件%s无法被处理' % (path))
    
#开始执行
factory(bootPath)  #执行工厂方法，获得全部文件完整路径
threadList = []
print('目录迭代完成，当前要执行的任务个数为：' + str(len(txtFileList)))
print('将使用多线程并行执行...')
for item in txtFileList:
    t = threading.Thread(target=upLoadTxt,args=(item,))
    threadList.append(t)
    #任务不能一股脑加入进去，否则一旦要处理的任务过多就会导致线程表原地爆炸。
    #必须使用阻塞器，其实就是在插入线程时进行活跃线程数判断。
    while len(threading.enumerate()) > 5:  # 最大并行线程数（不设的话会爆炸）
        time.sleep(1)
    t.start()
    #多线程进行API提交，全部完成后就完成了。
print('任务已下发，等待子线程完成任务...')
startTime = time.time()
for t in threadList:
    t.join()  # 等待剩余任务执行
print('任务已全部完成！用时：' + str(time.time() - startTime))
